#ifndef _SQLSERVER_H_
#define _SQLSERVER_H_

#include <utility>
#include <unistd.h>
#include <functional>

/* muduo 网络库 */
#include "muduo/base/Thread.h"
#include "muduo/base/Logging.h"
#include "muduo/net/EventLoop.h"
#include "muduo/net/TcpServer.h"

/* Sql 连接池 */
#include "../include/Connection_Pool.hpp"
#include "../include/SqlConnection.h"

/* 线程池 */
#include "../include/thread_pool.h"

class SqlServer 
{
private:
    muduo::net::EventLoop* loop_;
    muduo::net::TcpServer server_;
    static constexpr size_t Header_Length = sizeof(int32_t);    // 消息头部字段的大小

public:
    /* 构造函数 */
    SqlServer(muduo::net::EventLoop* loop, const muduo::net::InetAddress& listenAddr);
    /* 开始运行服务器 */
    void start() { server_.start(); }

private:
    /* 新连接到来时回调 */
    void onConnection(const muduo::net::TcpConnectionPtr& conn);
    /* 有可读事件到来时回调 */
    void onMessage(const muduo::net::TcpConnectionPtr& conn, muduo::net::Buffer* buf, muduo::Timestamp time);
    /* 解析数据包 */
    void parseMessage(const muduo::net::TcpConnectionPtr& conn, const std::string& message);
    /* 创建用户设备表 */
    void createDeviceTable(const std::string& tableName);
    /* 添加用户设备数据(多线程) */
    void insertDeviceData(std::string tableName, std::string mac);
    /* 创建用户数据表 */
    void createUserDataTable(const std::string& tableName);
    /* 添加用户数据(多线程) */
    void insertUserData(std::string tableName, std::string date, float temp, float humi);
    /* 查询设备列表 */
    void queryDeviceList(const muduo::net::TcpConnectionPtr& conn, const std::string& tableName);
    /* 查询设备数据 */
    void queryDeviceData(const muduo::net::TcpConnectionPtr& conn, const std::string& tableName, const std::string& date_start, const std::string& date_end);
};

#endif